home *** CD-ROM | disk | FTP | other *** search
/ Shareware Super Platinum 8 / Shareware Super Platinum 8.iso / mac / DATABASE / OBJ1_2.ZIP;1 / C_BROWSE.PRG < prev    next >
Encoding:
Text File  |  1993-01-21  |  26.0 KB  |  766 lines

  1. //*****************************************************************************
  2. // C_Brows.prg
  3. // Simple Browse class for OBJECT v2.03
  4. // Copyright (c) 1991, JHK, JHK-Software, Piestany
  5. // Please compile with: /N/M/W/A
  6. //-----------------------------------------------------------------------------
  7.  
  8. #include "Set.ch"
  9. #include "InKey.ch"
  10. #include "Object.ch"
  11. #include "SetCurs.ch"
  12.  
  13. static originSkipper     //TBrowseNew():SkipBlock
  14.  
  15. create class Browse from Task
  16.   export:
  17.   var MoreRecords      // true                  //used only for help F1
  18.   var MaskFeature      // false                 //see the Mask class
  19.   var CanShowSkip      // false                 //see Browse::EndInit()
  20.   var CanEdit          // true                  //editting allowed
  21.   var CanAppend        // true                  //append allowed (copy last array item)
  22.   var CanSwap          // true                  //swap state of browse
  23.   var CanSkip          // true                  //allow skip for Form mode
  24.   var FormActive       // false                 //current state of this object
  25.   var CanMoveCursor    // true                  //move cursor after edit field in direction...
  26.   var Direction        // K_RIGHT               //can be: Up,Down,Left,Right
  27.   var QuickEdit        // true                  //directly edit in Browse (else need press K_ENTER)
  28.   var SetConfirm       // Set(_SET_CONFIRM)     //local SET CONFIRM value
  29.   var AddMsg           // ""                    //append this message into dialogue line
  30.   var InsBlock         // {|o|nil}              //insert_row_code_block
  31.   var DelBlock         // {|o|nil}              //delete_row_code_block
  32.   var PreSkip          // nil       //{||true}  //preSkip function
  33.   var PostSkip         // nil       //{||nil}   //postSkip function
  34.   var InfoBlock        // {|o|nil}              //evaluate before waiting for key
  35.   var TestVRecord      // {|o,g|true}           //disable editing for virtual record, (abstract method for DBrowse)
  36.   var GetList          // {}                    //List of all gets in current object
  37.   var DoGetList        // {}                    //List of all DoGet code_blocks in current object
  38.   var DelGet           // {}                    //list temporary deleted gets from GetList
  39.   var DelDoGet         // {}                    //list temporary deleted DoGets from DoGetList
  40.   var Tb               // nil                   //TBrowse object
  41.   var Freeze           // 0                     //freeze for TBrowse and Form
  42.   var FormTop          // 1                     //form: first column in window
  43.   var Form             // (object of Window)    //form: R,C,Rs,Cs,MaxRows,MaxCols (used only as record structure)
  44.   var SetUp            // false                  //after method PostInit() will be always true!
  45.   method New=BrowseNew                       //o:New()
  46.   method Init=BrowseInit                     //o:Init(Name,R,C,Rs,Cs,Clr,Shadow)
  47.   method GoodInit=BrowseGoodInit             //o:GoodInit(Name,R,C,Rs,Cs,CurSize,Clr,Shadow)
  48.   method AddBlock=BrowseAddBlock             //o:AddBlock(LongName,ShortName,VarName,Block,DoGet,Picture,When,Valid)
  49.   method AddGet=BrowseAddGet                 //o:AddGet(Get,DoGet)
  50.   method PostInit=BrowsePostInit             //o:PostInit()         //need for good initialize of form state this object
  51.   method DoGet=BrowseDoGet                   //o:DoGet()            //process editting for one field
  52.   method VPaint=BrowseVPaint                 //o:VPaint()           //draw inside window
  53.   method SwapForm=BrowseSwapForm             //o:SwapForm()         //change current state of this object
  54.   method VProcess=BrowseVProcess             //o:VProcess()         //Done() will be wirtual
  55.   method Process=BrowseProcess               //o:Process()          //look for SetUp (has been PostInit()?)
  56.   method DoForm=BrowseDoForm                 //o:DoForm()           //called from VProcess(), Form mode
  57.   method DoBrowse=BrowseDoBrowse             //o:DoBrowse()         //called from VProcess(), Browse mode
  58.   method FormPaint=BrowseFormPaint           //o:FormPaint()        //VPaint() for Form
  59.   method MaskPaint=BrowseMaskPaint     //abstract method defined in Mask class !!!
  60.   endclass
  61.  
  62.  
  63. //*****************************************************************************
  64. // Browse:New() --> self
  65. // initialize new object
  66. //
  67. constructor BrowseNew()
  68.   ::Color+=", "+ListAsArray(m->Color:Desk)[nNormal]
  69.   ::MoreRecords:= true
  70.   ::MaskFeature:= false
  71.   ::CanShowSkip:= false
  72.   ::CanEdit:= true
  73.   ::CanAppend:= true
  74.   ::CanSwap:= true
  75.   ::CanSkip:= true
  76.   //::PreSkip:= {||true}
  77.   //::PostSkip:= {||nil}
  78.   ::FormActive:= false
  79.   ::CanMoveCursor:= true
  80.   ::Direction:= K_RIGHT
  81.   ::QuickEdit:= true
  82.   ::SetConfirm:= Set(_SET_CONFIRM)
  83.   ::AddMsg:= ""
  84.   ::InsBlock:= {|o|nil}
  85.   ::DelBlock:= {|o|nil}
  86.   ::InfoBlock:= {|o|nil}
  87.   ::TestVRecord:= {|o,g|true}  //self_object,Get_object
  88.   ::GetList:= {}
  89.   ::DoGetList:= {}
  90.   ::DelGet:= {}
  91.   ::DelDoGet:= {}
  92.   ::Tb:= nil
  93.   ::Freeze:= 0
  94.   ::FormTop:= 1
  95.   ::Form:= (object of Window)
  96.   ::SetUp:= false
  97.   return(self)
  98.  
  99.  
  100. //*****************************************************************************
  101. // Browse:Init(Name,R,C,Rs,Cs,Clr,Shadow) --> true
  102. // initialize new view object
  103. //
  104. method function BrowseInit(Name,R,C,Rs,Cs,Clr,Shadow)
  105.   ::super(Task):Init(Name,R,C,Rs,Cs,Clr,Shadow)
  106.   return(EndInit(self))
  107.  
  108.  
  109. //*****************************************************************************
  110. // Browse:GoodInit(Name,R,C,Rs,Cs,CurSize,Clr,Shadow) --> true
  111. // initialize new view object
  112. //
  113. method function BrowseGoodInit(Name,R,C,Rs,Cs,CurSize,Clr,Shadow)
  114.   ::super(Task):GoodInit(Name,R,C,Rs,Cs,CurSize,Clr,Shadow)
  115.   return(EndInit(self))
  116.  
  117.  
  118. //-----------------------------------------------------------------------------
  119. // Browse::EndInit() --> nil
  120. // initialize TBrowse object
  121. //
  122. static function EndInit(Browse)
  123.   local b:=TBrowseDb()
  124.   originSkipper:=b:SkipBlock
  125.   b:Freeze:=Browse:Freeze
  126.   b:HeadSep:="ƒ≈ƒ"
  127.   b:ColSep:="   "
  128.   b:ColPos:=1
  129.   Browse:Tb:=b
  130.   return(true)
  131.  
  132.  
  133. //*****************************************************************************
  134. // Browse:AddBlock(LongName,ShortName,VarName,Block,DoGet,Picture,When,Valid) --> nil
  135. // create simple_get_object and add it into Browse
  136. //
  137. method function BrowseAddBlock(LongName,ShortName,VarName,Block,DoGet,Picture,When,Valid)
  138.   local Get
  139.   local OldC:=SetColor(::Color)
  140.   default ShortName to ""
  141.   default LongName to ShortName
  142.   default VarName to ShortName
  143.   if( At("->",VarName)==0, VarName:="MEMORY->"+VarName, )
  144.   Get:=GetNew(0,0,Block,VarName)
  145.   Get:Picture:=Picture
  146.   Get:PreBlock:=When
  147.   Get:PostBlock:=Valid
  148.   Get:Cargo:=Array(nLenCargo)
  149.   Get:Cargo[nLongName]:=LongName
  150.   Get:Cargo[nShortName]:=ShortName
  151.   return(::AddGet(Get,DoGet))
  152.  
  153.  
  154. //*****************************************************************************
  155. // Browse:AddGet(Get,DoGet) --> true
  156. // add new get field into object
  157. //
  158. method function BrowseAddGet(Get,DoGet)
  159.   local c
  160.   default DoGet to {|o|o:DoGet()}
  161.   AAdd(::GetList,Get)
  162.   AAdd(::DoGetList,DoGet)
  163.   c:=TbColumnNew(Get:Cargo[nShortName],{|v|Transform(Eval(Get:Block,v),Get:Picture)})
  164.   c:DefColor:={nNormal,nUnSelect}
  165.   ::Tb:AddColumn(c)
  166.   if Empty(c:Heading); ::Tb:HeadSep:=nil; endif
  167.   return(true)
  168.  
  169.  
  170. //*****************************************************************************
  171. // Browse:PostInit() --> true
  172. //need for good initialize of form state this object
  173. //
  174. method function BrowsePostInit()
  175.   local ar:={}
  176.   local MCol:=0
  177.   local Rs:=Min(::Tb:ColCount,MaxRow()-3)
  178.   local Cs:=Len(::Name)+9
  179.   IEval(::Tb:ColCount,{|i|Cs:=Max(Cs,GetColSize(@MCol,@ar,::GetList[i]))})
  180.   Cs++
  181.   IEval(::Tb:ColCount,{|i|SetColSize(ar[i],::GetList[i],Cs)})
  182.   Cs:=Min( Max(Cs+2, Len(::Name)+11), MaxCol()-1)
  183.   ::Form:super(Box):GoodInit(,-3,-3,Rs,Cs)
  184.   ::Form:MaxRows:=Rs
  185.   ::Form:MaxCols:=Cs
  186.   ::Form:MinCols:=MCol+3
  187.   if ::FormActive
  188.     SwapRCInfo(self)
  189.   endif
  190.   if !Empty(::PreSkip) or !Empty(::PostSkip) or ::CanShowSkip
  191.     ::Tb:SkipBlock:={|n|Skipper(n,self)}
  192.     default ::PreSkip:={||true}
  193.     default ::PostSkip:= {||nil}
  194.   endif
  195.   ::Tb:Freeze:=::Freeze
  196.   ::Tb:ColPos:=::Freeze+1
  197.   ::SetUp:=true
  198.   return(true)
  199.  
  200. static function Skipper(n,Browse)
  201.   local i:=0
  202.   if Eval(Browse:PreSkip,Browse)
  203.     if Browse:CanShowSkip; SaveDOut(ResTxt(176)); endif
  204.     i:=Eval(originSkipper,n)
  205.     if Browse:CanShowSkip; RestDOut(); endif
  206.     Eval(Browse:PostSkip,Browse)
  207.   endif
  208.   return(i)
  209.  
  210. static function GetColSize(MCol,ar,get)
  211.   local ln
  212.   ln:=Len(Transform(get:VarGet(),Get:Picture))
  213.   AAdd(ar,ln)
  214.   MCol:=Max(MCol,ln)
  215.   return(Len(get:Cargo[nLongName])+ln)
  216.  
  217. static function SetColSize(ln,get,Cs)
  218.   get:Cargo[nLongName]:=" "+PadR(get:Cargo[nLongName],Cs-ln,".")
  219.   return(true)
  220.  
  221.  
  222. //*****************************************************************************
  223. // Browse:DoGet() --> true
  224. // default DoGet method: editting for one field in Browse mode
  225. //
  226. method function BrowseDoGet()
  227.   local Pict
  228.   local n:=::Tb:ColPos
  229.   local Get:=::GetList[n]
  230.   if ::FormActive and ::MaskFeature
  231.     Get:Row:=::Row+Get:Cargo[nRowOffset]
  232.     Get:Col:=::Col+Get:Cargo[nColOffset]
  233.     EditGet(Get,::CanEdit)
  234.   elseif ::FormActive
  235.     Get:Row:=::Row+::Freeze-::FormTop+::Tb:ColPos+1
  236.     Get:Col:=::Col+Get:Cargo[nColOffset]
  237.     EditGet(Get,::CanEdit)
  238.   else //!FormActive
  239.     if ::CanEdit
  240.       Pict:=Get:Picture                          //save picure
  241.       SetGoodSize(@Get,::Tb:ColWidth(n))
  242.       EditGetMsg(Get,::CanEdit)
  243.       Get:Picture:=Pict                          //restore picture
  244.       ::Tb:RefreshCurrent()
  245.       if LastKey()==K_ENTER and ::CanMoveCursor; StuffKey(::Direction); endif
  246.     else //!CanEdit
  247.       if NextKey()<>0 and NextKey()<>K_ENTER; InkeyWait(); endif
  248.     endif
  249.   endif
  250.   return(true)
  251.  
  252.  
  253. //-----------------------------------------------------------------------------
  254. // SetGoodSize(get,nSize) --> true
  255. // set good size for edited string, used in method DoGet().
  256. //
  257. static function SetGoodSize(g,nSize)
  258.   local c
  259.   if !(g:Type=="C"); return(true); endif  //not a string
  260.   c:=Transform(g:VarGet(),g:Picture)
  261.   if Len(c)<=nSize; return(true); endif   //size is ok
  262.   c:="@S"+NTrim(nSize)
  263.   if Empty(g:Picture);           g:Picture:=c
  264.   elseif Left(g:Picture,1)=="@"; g:Picture:=c+SubStr(g:Picture,2)
  265.   else;                          g:Picture:=c+" "+g:Picture
  266.   endif
  267.   return(true)
  268.  
  269.  
  270. //*****************************************************************************
  271. // Browse:VPaint() --> true
  272. // paint this object, this method is called from Window:Paint()!
  273. //
  274. method function BrowseVPaint()
  275.   local t,b,au
  276.   //DispEnd()  //begin is in Window:Paint()
  277.     ::Tb:ColorSpec:=::Color
  278.     if ::MaskFeature and ::FormActive  //abstract rutine for class Mask
  279.       ::MaskPaint()
  280.     elseif ::FormActive
  281.       if ::Tb:ColPos<::FormTop                           //ColPos is OutOfRange (up) ?
  282.         ::FormTop:=::Tb:ColPos                           //yes, correct it
  283.       elseif ::FormTop+::RowSize-::Freeze<=::Tb:ColPos   //ColPos is OutOfRange (down) ?
  284.         ::FormTop:=::Tb:ColPos-::RowSize+::Freeze+1      //yes, correct it
  285.       endif
  286.       //if Len(::DoGet)-::FormTop+1<::RowSize   //update FormTop
  287.       //  ::FormTop:=Len(::DoGet)-::RowSize+1   //for maximize
  288.       //endif                                   //window
  289.       ::FormPaint()
  290.     else
  291.       t:=Second()
  292.       b:=::Tb
  293.       au:=b:AutoLite
  294.       b:nTop:=::Row+1
  295.       b:nLeft:=::Col+1
  296.       b:nBottom:=::Row+::RowSize
  297.       b:nRight:=::Col+::ColSize
  298.       b:Configure()
  299.       b:AutoLite:=false
  300.       while !b:Stabilize() and Second()-t<nVPaintWaitSec and NextKey()==0; endwhile
  301.       b:AutoLite:=au
  302.     endif
  303.   //DispBegin()
  304.   return(true)
  305.  
  306.  
  307. //-----------------------------------------------------------------------------
  308. // Browse:FormPaint() --> true
  309. // VPaint() for Form
  310. //
  311. method function BrowseFormPaint()
  312.   local j:=Min(::RowSize-::Freeze,::Tb:ColCount-::FormTop+1)
  313.   local ClrNorm:=::Color
  314.   local ClrUns:=ListAsArray(::Color)[nUnSelect]
  315.   IEval(::Freeze,{|i|DispRow(self,i,::GetList[i],@ClrNorm,@ClrUns)})
  316.   IEval(j,{|i|DispRow(self,i+::Freeze,::GetList[i+::FormTop-1],@ClrNorm,@ClrUns)})
  317.   return(true)
  318.  
  319.  
  320. //-----------------------------------------------------------------------------
  321. // Browse::DispRow() --> true
  322. // display one row from form
  323. //
  324. static function DispRow(Browse,i,Get,ClrNorm,ClrUns)
  325.   local s1:=Get:Cargo[nLongName]
  326.   local s2:=Transform(Get:VarGet(),Get:Picture)
  327.   SetPos(Browse:Row+i,Browse:Col+1)
  328.   DispOut(Left(s1,Browse:ColSize-Len(s2)-2),ClrNorm)
  329.   DispOut(".",ClrNorm)
  330.   Get:Cargo[nColOffset]:=Col()-Browse:Col
  331.   DispOut(s2,ClrUns)
  332.   DispOut(" ",ClrNorm)
  333.   return(true)
  334.  
  335.  
  336. //*****************************************************************************
  337. // Browse:SwapForm() --> true
  338. // reconfigure this object
  339. //
  340. method function BrowseSwapForm()
  341.   SwapRCInfo(self)
  342.   ::FormActive:=!::FormActive
  343.   ::RePaint()
  344.   return(true)
  345.  
  346. static function SwapRCInfo(Browse)
  347.   Swap(Browse:Row,Browse:Form:Row)
  348.   Swap(Browse:Col,Browse:Form:Col)
  349.   Swap(Browse:RowSize,Browse:Form:RowSize)
  350.   Swap(Browse:ColSize,Browse:Form:ColSize)
  351.   Swap(Browse:MaxRows,Browse:Form:MaxRows)
  352.   Swap(Browse:MaxCols,Browse:Form:MaxCols)
  353.   Swap(Browse:MinRows,Browse:Form:MinRows)
  354.   Swap(Browse:MinCols,Browse:Form:MinCols)
  355.   return(true)
  356.  
  357.  
  358. //*****************************************************************************
  359. // Browse:VProcess() --> true
  360. // main edit loop
  361. //
  362. method function BrowseVProcess()
  363.   local ah
  364.   ::Tb:ColorSpec:=::Color
  365.   Set(_SET_CONFIRM,::SetConfirm)
  366.   repeat
  367.     if ::FormActive
  368.       ah:={2}
  369.       if( ::MoreRecords, AAdd(ah,7), )
  370.       AAdd(ah,if(::CanEdit,10,9))
  371.     else
  372.       ah:={2}
  373.       if( ::CanAppend, AAdd(ah,3), )
  374.       AAdd(ah, if(::CanEdit,5,4) )
  375.       AAdd(ah, 6)
  376.     endif
  377.     if( !::UpFlag, AAdd(ah,1), )
  378.     SaveHelpIdx(ah)
  379.     if(::FormActive, ::DoForm(), ::DoBrowse())
  380.     RestHelpIdx()
  381.     if LastKey()==K_TAB and ::CanSwap; ::SwapForm(); endif
  382.   until LastKey()<>K_TAB
  383.   return(true)
  384.  
  385.  
  386. //*****************************************************************************
  387. // Browse:Process() --> nil
  388. // work around PostInit()
  389. //
  390. method function BrowseProcess()
  391.   if !::SetUp; ::PostInit(); endif
  392.   return(::super(Task):Process())
  393.  
  394.  
  395. //*****************************************************************************
  396. // Browse:DoForm() --> true
  397. // VProcess() for Form, main form loop
  398. //
  399. method function BrowseDoForm()
  400.   local Ch,Get
  401.   local c1:=::Color
  402.   local c2:=ListAsArray(::Color)[nUnSelect]
  403.   SaveDOut(if(::UpFlag,ResTxt(150),ResTxt(149))+if(::CanSwap,","+ResTxt(135),"")+if(!Empty(::AddMsg),","+::AddMsg,""))
  404.   repeat
  405.     if ::Tb:ColPos<=::Freeze       //lock frozen columns
  406.       ::Tb:ColPos:=::Freeze+1
  407.     endif
  408.     if ::FormTop+::RowSize-::Freeze<=::Tb:ColPos   //ColPos is OutOfRange (down) ?
  409.       ::FormTop:=::Tb:ColPos-::RowSize-::Freeze+1  //yes, correct it
  410.     endif
  411.     Eval(::InfoBlock, self)
  412.     Eval(::DoGetList[::Tb:ColPos], self)
  413.     Ch:=LastKey()
  414.     do case
  415.       case Ch==K_F9     and !::MaskFeature;  MoveColumn(self)
  416.       case Ch==K_ALT_F9 and !::MaskFeature;  Freeze(self)
  417.       *
  418.       case Ch==K_SH_F9;     HideColumn(self)
  419.       case Ch==K_CTRL_F9;   ShowColumn(self)
  420.       *
  421.       case Ch==K_UP;        GetUp(self,c1,c2)
  422.       case Ch==K_DOWN;      GetDown(self,c1,c2)
  423.       case Ch==K_ENTER;     GetDown(self,c1,c2)
  424.       case Ch==K_CTRL_HOME; GetGoTop(self)
  425.       case Ch==K_CTRL_END;  GetGoBottom(self)
  426.       *
  427.       case Ch==K_PGUP;      GetDbSkip(self,{||DbSkip(-1)})
  428.       case Ch==K_PGDN;      GetDbSkip(self,{||DbSkip(+1)})
  429.       case Ch==K_CTRL_PGUP; GetDbSkip(self,{||DbGoTop()})
  430.       case Ch==K_CTRL_PGDN; GetDbSkip(self,{||DbGoBottom()})
  431.       *
  432.       case Ch==K_TAB;       exitif ::CanSwap  //task:swap (form<->browse)
  433.       case Ch==K_ESC;       exit                   //task:done()
  434.       case Ch==K_CTRL_RET;  exit                   //task:done()
  435.       case Ch==nSwapTask;   exit                   //standart task swapping
  436.     endcase
  437.   endrepeat
  438.   RestDOut()
  439.   return(true)
  440.  
  441.  
  442. static function GetUp(Browse,c1,c2)
  443.   local R,C
  444.   local n:=Browse:Tb:ColPos
  445.   if n>Browse:Freeze+1
  446.     n--
  447.     if n<Browse:FormTop
  448.       Browse:FormTop--
  449.       if !Browse:MaskFeature
  450.         R:=Browse:Row+Browse:Freeze+1
  451.         C:=Browse:Col+1
  452.         Scroll(R,C,R+Browse:RowSize-Browse:Freeze-1,C+Browse:ColSize-1,-1)
  453.         DispRow(Browse,Browse:Freeze+n-Browse:FormTop+1,Browse:GetList[n],c1,c2)
  454.       endif
  455.     endif
  456.   endif
  457.   Browse:Tb:ColPos:=n
  458.   return(true)
  459.  
  460.  
  461. static function GetDown(Browse,c1,c2)
  462.   local R,C
  463.   local n:=Browse:Tb:ColPos
  464.   if n<Len(Browse:GetList)
  465.     n++
  466.     if n>Browse:FormTop+Browse:RowSize-Browse:Freeze-1
  467.       Browse:FormTop++
  468.       if !Browse:MaskFeature
  469.         R:=Browse:Row+Browse:Freeze+1
  470.         C:=Browse:Col+1
  471.         Scroll(R,C,R+Browse:RowSize-Browse:Freeze-1,C+Browse:ColSize-1,+1)
  472.         DispRow(Browse,Browse:Freeze+n-Browse:FormTop+1,Browse:GetList[n],c1,c2)
  473.       endif
  474.     endif
  475.   endif
  476.   Browse:Tb:ColPos:=n
  477.   return(true)
  478.  
  479.  
  480. static function GetPgUp(Browse)
  481.   local n:=Browse:Tb:ColPos
  482.   if n>Browse:Freeze+1
  483.     n-=Browse:RowSize-Browse:Freeze
  484.     Browse:FormTop-=Browse:RowSize-Browse:Freeze
  485.     if n<Browse:Freeze+1; n:=Browse:Freeze+1; endif
  486.     if Browse:FormTop<Browse:Freeze+1; Browse:FormTop:=Browse:Freeze+1; endif
  487.     if !Browse:MaskFeature
  488.       Browse:Scroll(0)
  489.       Browse:FormPaint(Browse)
  490.     endif
  491.   endif
  492.   Browse:Tb:ColPos:=n
  493.   return(true)
  494.  
  495.  
  496. static function GetPgDn(Browse)
  497.   local n:=Browse:Tb:ColPos
  498.   if n<Len(Browse:GetList)
  499.     n+=Browse:RowSize-Browse:Freeze
  500.     if n>Len(Browse:GetList); n:=Len(Browse:GetList); endif
  501.     if Browse:FormTop+Browse:RowSize-Browse:Freeze<Len(Browse:GetList)
  502.       Browse:FormTop+=Browse:RowSize-Browse:Freeze
  503.     endif
  504.     if !Browse:MaskFeature
  505.       Browse:Scroll(0)
  506.       Browse:FormPaint(Browse)
  507.     endif
  508.   endif
  509.   Browse:Tb:ColPos:=n
  510.   return(true)
  511.  
  512.  
  513. static function GetGoTop(Browse)
  514.   if Browse:Tb:ColPos>Browse:Freeze+1
  515.     Browse:Tb:ColPos:=Browse:FormTop:=Browse:Freeze+1
  516.     if !Browse:MaskFeature
  517.       Browse:FormPaint(Browse)
  518.     endif
  519.   endif
  520.   return(true)
  521.  
  522.  
  523. static function GetGoBottom(Browse)
  524.   Browse:Tb:ColPos:=Len(Browse:GetList)
  525.   Browse:FormTop:=Browse:Tb:ColPos-Browse:RowSize+Browse:Freeze+1
  526.   if Browse:FormTop<Browse:Freeze+1; Browse:FormTop:=Browse:Freeze+1; endif
  527.   if !Browse:MaskFeature
  528.     Browse:FormPaint(Browse)
  529.   endif
  530.   return(true)
  531.  
  532.  
  533. static function GetDbSkip(Browse,bBlock)
  534.   local Rn
  535.   if Browse:CanSkip
  536.     if Empty(Browse:PreSkip) or Eval(Browse:PreSkip,Browse)
  537.       if Browse:CanShowSkip; SaveDOut(ResTxt(176)); endif
  538.       Rn:=RecNo()
  539.       Eval(bBlock)            //can be: DbSkip(Òn),DbGoTop(),DbGoBottom()
  540.       if RecNo()<=LastRec()   //not a virtual record
  541.         Browse:RecNo:=RecNo()
  542.         if Browse:MaskFeature
  543.           Browse:MaskPaint()
  544.         else
  545.           Browse:FormPaint()
  546.         endif
  547.         Browse:SaveIn()
  548.       else
  549.         Go Rn
  550.       endif
  551.       if Browse:CanShowSkip; RestDOut(); endif
  552.       if( !Empty(Browse:PostSkip), Eval(Browse:PostSkip,Browse), )
  553.     endif
  554.   endif
  555.   return(true)
  556.  
  557.  
  558. //*****************************************************************************
  559. // Browse:DoBrowse() --> true
  560. // VProcess() for Browse, main browse loop
  561. //
  562. method function BrowseDoBrowse()
  563.   local Ch,g,x
  564.   local b:=::Tb
  565.   if b:nTop<>::Row+1 or b:nLeft<>::Col+1
  566.     b:nTop:=::Row+1
  567.     b:nLeft:=::Col+1
  568.     b:nBottom:=::Row+::RowSize
  569.     b:nRight:=::Col+::ColSize
  570.     b:Configure()
  571.   endif
  572.   SaveDOut(if(::UpFlag,ResTxt(150),if(::CanAppend,ResTxt(151),ResTxt(149)))+if(::CanSwap,","+ResTxt(135),"")+if(!Empty(::AddMsg),","+::AddMsg,""))
  573.   repeat
  574.     if ::Tb:ColPos<=::Freeze       //lock frozen columns
  575.       ::Tb:ColPos:=::Freeze+1
  576.     endif
  577.     while !::Tb:Stabilize() and NextKey()==0; endwhile
  578.     SetCursor(SC_NONE)
  579.     Eval(::InfoBlock, self)
  580.     ReadHelpVar(::GetList[::Tb:ColPos]:Name)
  581.     Ch:=PauseKey(0)
  582.     ReadHelpVar("")
  583.     do case
  584.       case Ch==K_F9;      MoveColumn(self)
  585.       case Ch==K_ALT_F9;  Freeze(self)
  586.       case Ch==K_SH_F9;   HideColumn(self)
  587.       case Ch==K_CTRL_F9; ShowColumn(self)
  588.       *
  589.       case Ch==K_DOWN;       ::Tb:Down(); ::Direction:=Ch
  590.       case Ch==K_UP;         ::Tb:Up(); ::Direction:=Ch
  591.       case Ch==K_PGDN;       ::Tb:PageDown()
  592.       case Ch==K_PGUP;       ::Tb:PageUp()
  593.       case Ch==K_CTRL_PGUP;  ::Tb:GoTop()
  594.       case Ch==K_CTRL_PGDN;  ::Tb:GoBottom()
  595.       *
  596.       case Ch==K_HOME;       ::Tb:Home()
  597.       case Ch==K_END;        ::Tb:End()
  598.       case Ch==K_LEFT;       ::Tb:Left(); ::Direction:=Ch
  599.       case Ch==K_RIGHT;      ::Tb:Right(); ::Direction:=Ch
  600.       case Ch==K_CTRL_LEFT;  ::Tb:PanLeft()
  601.       case Ch==K_CTRL_RIGHT; ::Tb:PanRight()
  602.       case Ch==K_CTRL_HOME;  ::Tb:PanHome()
  603.       case Ch==K_CTRL_END;   ::Tb:PanEnd()
  604.       *
  605.       case Ch==K_INS;  if ::CanAppend; Eval(::InsBlock, self); endif
  606.       case Ch==K_DEL;  if ::CanAppend; Eval(::DelBlock, self); endif
  607.       *
  608.       case Ch==K_TAB;       exitif ::CanSwap   //task:swap (form<->browse)
  609.       case Ch==K_ESC;       exit                    //task:done()
  610.       case Ch==K_CTRL_RET;  exit                    //task:done()
  611.       case Ch==nSwapTask;   exit                    //standart task swapping
  612.       *
  613.       otherwise
  614.         if (Ch==K_ENTER or ::QuickEdit)
  615.           while !::Tb:Stabilize(); endwhile
  616.           SaveDOut(::AddMsg)
  617.           g:=::GetList[::Tb:ColPos]
  618.           g:Row:=Row()
  619.           g:Col:=Col()
  620.           if Transform(g:VarGet(),)==ResTxt(134)  //DBrowse! Memo_field in get!
  621.             if Eval(::TestVRecord,self,g)
  622.               SaveHelpIdx(if(::CanEdit,{12,1},{15,11,1}))
  623.               Eval(g:PostBlock,g,::CanEdit)
  624.               RestHelpIdx()
  625.             endif
  626.           else
  627.             if LastKey()<>K_ENTER; StuffKey(LastKey()); endif
  628.             SaveHelpIdx(if( ::CanEdit, {2,8,1}, {2,1}))
  629.             Eval(::DoGetList[::Tb:ColPos], self)
  630.             RestHelpIdx()
  631.           endif
  632.           RestDOut()
  633.           exitif LastKey()==nSwapTask
  634.         endif
  635.     endcase
  636.   endrepeat
  637.   if !::IsDead; ::Tb:DeHilite(); endif
  638.   RestDOut()
  639.   return(true)
  640.  
  641.  
  642. //-----------------------------------------------------------------------------
  643. // Browse::Freeze() --> true
  644. // lock any columns in Browse or rows in Form
  645. //
  646. static function Freeze(Browse)
  647.   SaveDOut(Browse:AddMsg)
  648.   Browse:Freeze:=EditItPrim(Browse:Freeze,ResTxt(020),,Browse:Row+Int(Browse:RowSize/2-1))
  649.   RestDOut()
  650.   if Browse:Freeze<0; Browse:Freeze:=0; Bell(); endif
  651.   if Browse:Freeze>=Browse:Tb:ColCount; Browse:Freeze:=Browse:Tb:ColCount-1; Bell(); endif
  652.   Browse:Tb:Freeze:=Browse:Freeze
  653.   if Browse:Freeze>=Browse:FormTop; Browse:FormTop:=Browse:Freeze+1; endif
  654.   if Browse:FormActive; Browse:Scroll(0); Browse:FormPaint(Browse); endif
  655.   return(true)
  656.  
  657.  
  658. //-----------------------------------------------------------------------------
  659. // Browse::MoveColumn() --> true
  660. // move current TbColumn
  661. //
  662. static function MoveColumn(Browse)
  663.   local Ch,Col,Curs,R,Clr,n,i
  664.   SaveDOut(ResTxt(139))
  665.   Curs:=SetCursor()
  666.   Clr:=Chr(Color2Num(ListAsArray(Browse:Color)[nUnSelect]))
  667.   n:=Browse:Tb:ColPos
  668.   repeat
  669.     if Browse:FormActive
  670.       SetCursor(SC_NONE)
  671.       R:=Browse:Row+Browse:Freeze+n-Browse:FormTop+1
  672.       RestScreen(R,Browse:Col+1,R,Browse:Col+Browse:ColSize, Transform(SaveScreen(R,Browse:Col+1,R,Browse:Col+Browse:ColSize), Replicate("X"+Clr,Browse:ColSize)))
  673.     endif
  674.     Ch:=PauseKey(0)
  675.     do case
  676.       case Ch=K_LEFT or Ch==K_UP
  677.         if n>Browse:Freeze+1
  678.           i:=n
  679.           Col:=Browse:Tb:DelColumn(n)
  680.           Browse:Tb:Left()
  681.           n:=Browse:Tb:ColPos
  682.           Browse:Tb:InsColumn(n,Col)
  683.           Swap(Browse:GetList[i],Browse:GetList[n])
  684.           Swap(Browse:DoGetList[i],Browse:DoGetList[n])
  685.           if n<Browse:FormTop
  686.             Browse:FormTop--
  687.           endif
  688.         endif
  689.       case Ch=K_RIGHT or Ch==K_DOWN
  690.         if n<Browse:Tb:ColCount
  691.           i:=n
  692.           Col:=Browse:Tb:DelColumn(n)
  693.           Browse:Tb:Right()
  694.           n:=Browse:Tb:ColPos
  695.           Browse:Tb:InsColumn(n,Col)
  696.           Swap(Browse:GetList[i],Browse:GetList[n])
  697.           Swap(Browse:DoGetList[i],Browse:DoGetList[n])
  698.           if n>=Browse:FormTop+Browse:RowSize-Browse:Freeze
  699.             Browse:FormTop++
  700.           endif
  701.         endif
  702.       otherwise
  703.         Ch:=nSwapTask
  704.     endcase
  705.     if Browse:FormActive
  706.       Browse:FormPaint(Browse)
  707.     else
  708.       while !Browse:Tb:Stabilize() and NextKey()==0; endwhile
  709.     endif
  710.   until Ch==nSwapTask
  711.   SetCursor(Curs)
  712.   RestDOut()
  713.   return(true)
  714.  
  715.  
  716. //-----------------------------------------------------------------------------
  717. // Browse::HideColumn() --> true
  718. // hide current TbColumn
  719. //
  720. static function HideColumn(Browse)
  721.   local n:=Browse:Tb:ColPos
  722.   returnif n<=Browse:Freeze with false
  723.   returnif Len(Browse:GetList)<=(Browse:Freeze+1) with false
  724.   Browse:Tb:DelColumn(n)
  725.   AAdd(Browse:DelGet,ATrueDel(Browse:GetList,n))
  726.   AAdd(Browse:DelDoGet,ATrueDel(Browse:DoGetList,n))
  727.   if n>Browse:Tb:ColCount
  728.     Browse:Tb:ColPos:=Browse:Tb:ColCount
  729.   endif
  730.   if Browse:FormActive
  731.     Browse:Scroll(0)
  732.     Browse:FormPaint(Browse)
  733.   endif
  734.   return(true)
  735.  
  736.  
  737. //-----------------------------------------------------------------------------
  738. // Browse::ShowColumn() --> true
  739. // hide current TbColumn
  740. //
  741. static function ShowColumn(Browse)
  742.   local n,g,c
  743.   if !Empty(Browse:DelGet)
  744.     n:=Browse:Tb:colPos
  745.     ATrueIns(Browse:GetList,n,g:=ATailDel(Browse:DelGet))
  746.     ATrueIns(Browse:DoGetList,n,ATailDel(Browse:DelDoGet))
  747.     c:=TbColumnNew(g:Cargo[nShortName],g:Block)
  748.     c:DefColor:={nNormal,nUnSelect}
  749.     Browse:Tb:InsColumn(n,c)
  750.     if Browse:FormActive
  751.       Browse:FormPaint(Browse)
  752.     endif
  753.   endif
  754.   return(true)
  755.  
  756.  
  757. //-----------------------------------------------------------------------------
  758. // Browse:MaskPaint() --> true
  759. // abstract method for Mask() class
  760. //
  761. method function BrowseMaskPaint()
  762. return(true)
  763.  
  764. //------------------------------------------------------- eof (c)JHK ----------
  765.  
  766.